home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
iguana
/
incosrc
/
incosrc.exe
/
MIRRBALL
/
MIRRBALL.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-08-14
|
31KB
|
1,327 lines
; ------------------------------ MIRRBALL.ASM ---------------------
; MirrorBall.
; (C) 1993 bye JCAB.
TRACE = 0
.MODEL SMALL
.STACK 1400
.386P
DOSSEG
LOCALS
JUMPS
INCLUDE VGASM.INC
INCLUDE VBLIB.INC
INCLUDE VTASM.INC
SCRW = 80
BallSize = 48
BallInercia = 2
MaxVel = 4
.DATA
INCLUDE BALL.INC
INCLUDE BALLGFX.INC
LG01 SEGMENT PARA PUBLIC
LogoBall DB 64000 DUP(0)
ENDS
.CODE
EXTRN POINTS : BYTE
;===================================================
.CODE
A_GDT label byte
NullDes dw 0, 0, 0, 0
CodeDes dw 0ffffh ; limit (bits 24-31)
db 0, 0, 0 ; base (bits 0-23)
db 10011011B ; present / DPL 0 / code / non conforming / readable
db 11001111B ; size 4Gb / 32 bits / limit
db 0 ; base
DataDes dw 0ffffh ; limit (bits 24-31)
db 0, 0, 0 ; base (bits 0-23)
db 10010011B ; present / DPL 0 / data / writeable
db 10001111B ; size 4Gb / 32 bits / limit
db 0 ; base
A_GDT_PTR dw 17h ; gdt size
dd 0 ; gdt linear base
;===================================================
.CODE
.STARTUP
CLD
; Protected mode fixup. Some programs like TLink from Borland leave the
; 386 segment registers unusable. This is to get them back.
SMSW AX
TEST AX,1
JNZ @@alreadyPM ; Do not fix if we are already in PM.
PUSH CS
SUB EAX,EAX
POP AX
SHL EAX,4
ADD EAX,OFFSET A_GDT
MOV DWORD PTR CS:[A_GDT_PTR].2,EAX
LGDT QWORD PTR CS:A_GDT_PTR
SMSW AX
OR AX,1
LMSW AX ; now running on protected mode
JMP @@ll1 ; clear prefetch queue
@@ll1:
MOV AX,10h ; adjust data selectors
MOV GS,AX
MOV FS,AX
MOV EAX,CR0
AND EAX,0FFFFFFFEh
MOV CR0,EAX ; now running on real mode
JMP @@ll2 ; clear prefetch queue
@@ll2:
XOR AX,AX
MOV FS,AX
MOV GS,AX
@@alreadyPM:
; End of PM fixup.
CALL InitMusic
CALL SetupMirrBallVideo
CALL DumpIguanaLogo
CALL VTDisconnectTimer
MOV CS:[VBLFullHandler],OFFSET MirrorFullHandler
XOR SI,SI
CALL InitializeTimerVBL
MOV BX,0
MOV DH,5
MOV DL,1
CALL VTMiddleSync
CALL VBLVSync
MainLoop:
SetBorder 10, 10, 10
CALL VBLVSync
MOV [NFrames],AX
INC [LoopCounter]
INC [FrameCounter]
CMP [FrameCounter],3
JC @@1
MOV [FrameCounter],0
@@1:
CALL CtrlFadeFondo
SetBorder 63,63,0
MOV CX,[NFrames]
@@mlp:
PUSH CX
CALL MoveBall
POP CX
LOOP @@mlp
SetBorder 63,0,0
CALL CallMusic
CALL EraseBall
SetBorder 0,0,63
MOV AX,[BallOffset]
MOV BX,OFFSET EraseSave1 ; 2 -> 1
TEST [FrameCounter],2
JNZ SHORT @@scrst
MOV BX,OFFSET EraseSave0 ; 1 -> 0
TEST [FrameCounter],1
JNZ SHORT @@scrst
MOV BX,OFFSET EraseSave2 ; 0 -> 2
@@scrst:
MOV [BX],AX
MOV AX,SEG LogoBall
MOV FS,AX
CALL CallMusic
CALL DrawBallL
SetBorder 0,63,63
CALL CallMusic
CALL DrawBallR
SetBorder 0,63,0
CALL CallMusic
COMMENT #
MOV AH,0
INT 16h
CMP AL,27
JZ @@Bye
JMP MainLoop
#
MOV BX,6
MOV AL,0
CALL VTCheckSemaphore
JNZ ByeBye
MOV AH,1
INT 16h
JNZ @@Bye
JMP MainLoop
@@Bye:
XOR AX,AX
INT 16h
ByeBye:
CALL EndTimerVBL
CALL VTConnectTimer
MOV DX,3C4h
MOV AX,0F02h ; All planes
OUT DX,AX
MOV DX,3CEh ; Bitmask...
MOV AX,00008h ; 00000000b
OUT DX,AX
PUSH DS
STD
MOV DI,SCRW*200*3-1
MOV SI,SCRW*200*4-1
MOV AX,0A000h
MOV ES,AX
MOV DS,AX
MOV CX,SCRW*200*3
REP MOVSB
POP DS
CLD
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 11111111b
OUT DX,AX
COMMENT #
CALL ZeroPalette
MOV AX,3
INT 10h
#
CALL RestoreSystemTime
MOV AX,4C00h
INT 21h
; =======================================
MirrorFullHandler:
PUSH DS
PUSH BX
PUSHA
MOV AX,@data
MOV DS,AX
CALL SetDisplayPage
POPA
POP BX
POP DS
RET
; =======================================
SetupMirrBallVideo:
VSync
MOV BX,SCRW*(216*2 + 16) ; Value from the BALLS part.
MOV DX,3D4h ; Set the display page.
MOV AL,0Ch
MOV AH,BH
OUT DX,AX
INC AL
MOV AH,BL
OUT DX,AX
VSync
; Setup the video addressing mode.
MOV DX,3C0h
MOV AL,30h
OUT DX,AL
MOV AL,01100001b
OUT DX,AL
MOV DX,3c4h
MOV AX,604h ; "Unchain my heart". And my VGA...
OUT DX,AX
MOV AX,0F02h ; All planes
OUT DX,AX
; Comienzo del modo de Hz reducidos.
MOV DX,3D4h
MOV CX,18h
MOV SI,OFFSET CRTCregs
@@cl1:
LODSW
; OUT DX,AX
LOOP @@cl1
; Final del modo de Hz reducidos.
MOV AX,14h ; Disable dword mode
OUT DX,AX
MOV AX,0E317h ; Enable byte mode.
OUT DX,AX
PUSH DS
MOV DX,3CEh ; Bitmask...
MOV AX,00008h ; 00000000b
OUT DX,AX
MOV SI,SCRW*(216*2 + 16)
MOV DI,0
MOV AX,0A000h
MOV ES,AX
MOV DS,AX
XOR AX,AX
MOV CX,SCRW*200
REP MOVSB
VSync
MOV DX,3D4h ; Set the display page to 0.
MOV AL,0Ch
XOR AH,AH
OUT DX,AX
INC AL
OUT DX,AX
VSync
XOR SI,SI
MOV CX,SCRW*200*3
REP MOVSB
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 11111111b
OUT DX,AX
POP DS
MOV SI,OFFSET NormalPalette
MOV CX,256
XOR AL,AL
CALL DumpPalette
RET
SetupMirrBallVideo1:
CALL ZeroPalette
MOV AX,13h
INT 10h
; CALL ZeroPalette
VSync
MOV DX,3C0h
MOV AL,30h
OUT DX,AL
MOV AL,11100001b
OUT DX,AL
MOV DX,3c4h
MOV AX,604h ; "Unchain my heart". And my VGA...
OUT DX,AX
MOV AX,0F02h ; All planes
OUT DX,AX
; Comienzo del modo de Hz reducidos.
MOV DX,3D4h
MOV CX,18h
MOV SI,OFFSET CRTCregs
@@cl1:
LODSW
; OUT DX,AX
LOOP @@cl1
; Final del modo de Hz reducidos.
MOV AX,14h ; Disable dword mode
OUT DX,AX
MOV AX,0E317h ; Enable byte mode.
OUT DX,AX
XOR DI,DI ; Clear the screen. All planes.
MOV AX,0A000h
MOV ES,AX
XOR AX,AX
MOV CX,8000h
REP STOSW
MOV SI,OFFSET NormalPalette
MOV CX,256
XOR AL,AL
CALL DumpPalette
RET
; =======================================
DumpIguanaLogo:
PUSH DS
MOV AX,SEG LogoBall
MOV ES,AX
MOV FS,AX
MOV AX,0A000h
MOV DS,AX
MOV DI,OFFSET LogoBall
MOV BX,4
@@lp0:
MOV DX,3CEh
MOV AL,04h ; One plane at a time.
MOV AH,BH
OUT DX,AX
XOR SI,SI
PUSH DI
MOV CX,64000/4
@@lp1:LODSB
; MOV [SI-1],AL
STOSB
ADD DI,3
LOOP @@lp1
POP DI
INC DI
INC BH
AND BH,3
DEC BL
JNZ @@lp0
POP DS
RET
DumpIguanaLogo1:
PUSH DS
MOV AX,SEG LogoBall
MOV DS,AX
MOV FS,AX
MOV AX,0A000h
MOV ES,AX
MOV SI,OFFSET LogoBall
MOV BX,104h
@@lp0:
MOV DX,3C4h
MOV AL,02h ; One plane at a time.
MOV AH,BH
OUT DX,AX
XOR DI,DI
PUSH SI
MOV CX,64000/4
@@lp1:LODSB
MOV ES:[DI+SCRW*200*3],AL
MOV ES:[DI+SCRW*200*2],AL
MOV ES:[DI+SCRW*200*1],AL
STOSB
ADD SI,3
LOOP @@lp1
POP SI
INC SI
SHL BH,1
DEC BL
JNZ @@lp0
POP DS
RET
; =======================================
SetDisplayPage:
MOV DX,3D4h
MOV BX,SCRW*200*1 ; 2 -> 1
TEST [FrameCounter],2
JNZ SHORT @@scrst
MOV BX,SCRW*200*0 ; 1 -> 0
TEST [FrameCounter],1
JNZ SHORT @@scrst
MOV BX,SCRW*200*2 ; 0 -> 2
@@scrst:
MOV AL,0Ch
MOV AH,BH
OUT DX,AX
INC AL
MOV AH,BL
OUT DX,AX
RET
; =======================================
CtrlFadeFondo:
MOV BX,40h
MOV AL,0
CALL VTCheckSemaphore
JZ @@Fin
@@sigue:
MOV AX,[FadeCounter]
INC [FadeCounter]
SUB AX,64
JC @@DoFade
JMP @@Fin
@@DoFade:
PUSH AX
MOV DI,OFFSET NormalPalette+147*3
MOV CX,6
XOR DL,DL
CALL FadeCol
MOV SI,OFFSET NormalPalette+147*3
MOV CX,6
MOV AL,147
CALL DumpPalette
POP SI
ADD SI,64
ADD SI,OFFSET LogoBall
MOV CX,1000
@@lp1:
MOV AL,FS:[SI]
CMP AL,147+6
JNC @@c1
MOV BYTE PTR FS:[SI],0
@@c1:ADD SI,64
LOOP @@lp1
@@Fin:
RET
; =======================================
GetRandomNumber:
MOV AX,[RandSeed]
MOV BX,[RandSeed2]
MOV BP,[RandSeed3]
ADD AX,0a137h
ADD BX,63f7h
ADD BP,784Ah
ROL AX,2
MOV [RandSeed],AX
ADD BX,AX
ROR BX,1
MOV [RandSeed2],BX
SUB BP,BX
XOR AX,BP
MOV [RandSeed3],BP
ADD AX,BX
RET
; =======================================
MoveBall:
MOV SI,[PointsPos]
MOV AL,CS:[SI]
INC SI
CBW
SHL AX,6
ADD [BallPosX],AX
MOV AL,CS:[SI]
INC SI
CBW
SHL AX,6
ADD [BallPosY],AX
MOV AL,CS:[SI]
INC SI
CBW
SHL AX,6
SUB [BallPosZ],AX
MOV [PointsPos],SI
MOV BX,[BallPosZ]
ADD BX,32
SHR BX,6
ADD BX,BX
ADD BX,OFFSET BallSegs
MOV BX,[BX]
MOV [BallSegment],BX
MOV AX,SCRW
MOV BX,[BallPosY]
ADD BX,32
SHR BX,6
MUL BX
MOV BX,[BallPosX]
ADD BX,32
SHR BX,6
MOV CX,BX
AND CX,3
SHR BX,2
ADD AX,BX
MOV [BallOffset],AX
MOV AL,11h
SHL AL,CL
MOV [PlaneBit],AL
MOV AX,[BallPosX]
ADD AX,32
SHR AX,6
ADD AX,BallSize/2
MOV [MaxDesplXn],AX
SUB AX,320
NEG AX
MOV [MaxDesplXp],AX
MOV AX,[BallPosY]
ADD AX,32
SHR AX,6
ADD AX,BallSize/2
MOV DX,320
MUL DX
MOV [MaxDesplYn],AX
SUB AX,200*320
NEG AX
MOV [MaxDesplYp],AX
RET
; =======================================
DrawBallL:
MOV BX,SCRW*200*1 ; 2 -> 1
TEST [FrameCounter],2
JNZ SHORT @@scrst
MOV BX,SCRW*200*0 ; 1 -> 0
TEST [FrameCounter],1
JNZ SHORT @@scrst
MOV BX,SCRW*200*2 ; 0 -> 2
@@scrst:
MOV AX,0A000h
MOV ES,AX
MOV BP,0
MOV GS,[BallSegment]
MOV SI,OFFSET BallGraphic
MOV DI,[BallOffset]
ADD BX,DI
XCHG BX,DI
SHL BX,2
MOV AL,[PlaneBit]
SHR AL,1
JNC SHORT @@p2
SUB BX,3
@@p2:
SHR AL,1
JNC SHORT @@p3
SUB BX,2
@@p3:
SHR AL,1
JNC SHORT @@p4
DEC BX
@@p4:
ADD BX,3
MOV CL,4
MOV CH,[PlaneBit]
@@lp0:
PUSH CX
PUSH DI
PUSH BX
MOV DX,3C4h
MOV AL,02h ; One plane at a time.
MOV AH,CH
OUT DX,AX
MOV CX,BallSize/4/2
@@lp1:PUSH CX
PUSH DI
PUSH BX
LODSW
ADD SI,2
ADD DI,AX
ADD BX,AX
ADD BX,AX
ADD BX,AX
ADD BX,AX
LODSW
MOV CL,AL
@@lp:
; Bucle interior. No reflejante.
MOV AH,GS:[BP]
INC BP
ADD AH,AH
SBB CH,CH
ADD AH,AH
JNC SHORT @@mirr
@@nomirr:
; Pixel superior.
MOV AX,[SI]
TEST BYTE PTR FS:[BX],CH
JNZ SHORT @@c6
MOV ES:[DI],AL
@@c6:
; Pixel inferior.
MOV DX,[SI+4]
SHL DX,2
ADD DX,BX
XCHG BX,DX
TEST BYTE PTR FS:[BX],CH
MOV BX,DX
JNZ SHORT @@c3
MOV DX,[SI+4]
ADD DI,DX
MOV ES:[DI],AH
SUB DI,DX
; Fin del bucle.
@@c3: ADD DI,SCRW
ADD BX,SCRW*4
ADD SI,6
DEC CL
JNZ SHORT @@lp
@@c5:
POP BX
POP DI
INC DI
ADD BX,4
POP CX
LOOP SMALL @@lp1
POP BX
POP DI
POP CX
INC BX
ROL CH,1
JNC SHORT @@c1
INC DI
@@c1:
DEC CL
JNZ SMALL @@lp0
RET
@@nopintX:
ADD BP,4
JMP @@nomirr
@@lpm:
; Bucle interior. Reflejante.
MOV AH,GS:[BP]
INC BP
ADD AH,AH
SBB CH,CH
ADD AH,AH
JC @@nomirr
@@mirr:
MOV DX,GS:[BP]
CMP DX,[MaxDesplXn]
JNC @@nopintX
; Pixel superior.
MOV AX,[SI]
TEST BYTE PTR FS:[BX],CH
JNZ SHORT @@c7
MOV DX,BX
SUB BX,GS:[BP]
SUB BX,GS:[BP+2]
JC SHORT @@c8
MOV BL,FS:[BX]
AND BL,BL
JZ @@c8
MOV AL,BL
@@c8:
MOV BX,DX
MOV BYTE PTR ES:[DI],AL
@@c7:
; Pixel inferior.
MOV DX,[SI+4]
SHL DX,2
ADD DX,BX
XCHG BX,DX
TEST BYTE PTR FS:[BX],CH
JNZ SHORT @@c4
SUB BX,GS:[BP]
ADD BX,GS:[BP+2]
JC SHORT @@c9
MOV BL,FS:[BX]
AND BL,BL
JZ @@c9
MOV AH,BL
@@c9:
ADD DI,[SI+4]
MOV ES:[DI],AH
SUB DI,[SI+4]
; Fin del bucle.
@@c4:
MOV BX,DX
ADD BP,4
ADD DI,SCRW
ADD BX,SCRW*4
ADD SI,6
DEC CL
JNZ @@lpm
JMP @@c5
; =======================================
DrawBallR:
MOV BX,SCRW*200*1 ; 2 -> 1
TEST [FrameCounter],2
JNZ SHORT @@scrst
MOV BX,SCRW*200*0 ; 1 -> 0
TEST [FrameCounter],1
JNZ SHORT @@scrst
MOV BX,SCRW*200*2 ; 0 -> 2
@@scrst:
MOV AX,0A000h
MOV ES,AX
MOV BP,0
MOV GS,[BallSegment]
MOV SI,OFFSET BallGraphic
MOV DI,[BallOffset]
ADD DI,BallSize/4
ADD BX,DI
XCHG BX,DI
SHL BX,2
MOV AL,[PlaneBit]
SHR AL,1
JNC SHORT @@p2
SUB BX,3
@@p2:
SHR AL,1
JNC SHORT @@p3
SUB BX,2
@@p3:
SHR AL,1
JNC SHORT @@p4
DEC BX
@@p4:
ADD BX,3
MOV CL,4
MOV CH,[PlaneBit]
@@lp0:
ROR CH,1
JNC SHORT @@c1
DEC DI
@@c1:
DEC BX
PUSH CX
PUSH DI
PUSH BX
MOV DX,3C4h
MOV AL,02h ; One plane at a time.
MOV AH,CH
OUT DX,AX
MOV CX,BallSize/4/2
@@lp1:PUSH CX
PUSH DI
PUSH BX
LODSW
ADD SI,2
ADD DI,AX
ADD BX,AX
ADD BX,AX
ADD BX,AX
ADD BX,AX
LODSW
MOV CL,AL
@@lp:
; Bucle interior. No reflejante.
MOV AH,GS:[BP]
INC BP
ADD AH,AH
SBB CH,CH
ADD AH,AH
JNC SHORT @@mirr
@@nomirr:
; Pixel superior.
MOV AX,[SI+2]
TEST BYTE PTR FS:[BX],CH
JNZ SHORT @@c6
MOV ES:[DI],AL
@@c6:
; Pixel inferior.
MOV DX,[SI+4]
SHL DX,2
ADD DX,BX
XCHG BX,DX
TEST BYTE PTR FS:[BX],CH
MOV BX,DX
JNZ SHORT @@c3
MOV DX,[SI+4]
ADD DI,DX
MOV ES:[DI],AH
SUB DI,DX
; Fin del bucle.
@@c3: ADD DI,SCRW
ADD BX,SCRW*4
ADD SI,6
DEC CL
JNZ SHORT @@lp
@@c5:
POP BX
POP DI
DEC DI
SUB BX,4
POP CX
LOOP SMALL @@lp1
POP BX
POP DI
POP CX
DEC CL
JNZ SMALL @@lp0
RET
@@nopintX:
ADD BP,4
JMP @@nomirr
@@lpm:
; Bucle interior. Reflejante.
MOV AH,GS:[BP]
INC BP
ADD AH,AH
SBB CH,CH
ADD AH,AH
JC @@nomirr
@@mirr:
MOV DX,GS:[BP]
CMP DX,[MaxDesplXp]
JNC @@nopintX
; Pixel superior.
MOV AX,[SI+2]
TEST BYTE PTR FS:[BX],CH
JNZ SHORT @@c7
MOV DX,BX
ADD BX,GS:[BP]
SUB BX,GS:[BP+2]
JC SHORT @@c8
MOV BL,FS:[BX]
AND BL,BL
JZ @@c8
MOV AL,BL
@@c8:
MOV BX,DX
MOV BYTE PTR ES:[DI],AL
@@c7:
; Pixel inferior.
MOV DX,[SI+4]
SHL DX,2
ADD DX,BX
XCHG BX,DX
TEST BYTE PTR FS:[BX],CH
JNZ SHORT @@c4
ADD BX,GS:[BP]
ADD BX,GS:[BP+2]
JC SHORT @@c9
MOV BL,FS:[BX]
AND BL,BL
JZ @@c9
MOV AH,BL
@@c9:
ADD DI,[SI+4]
MOV ES:[DI],AH
SUB DI,[SI+4]
; Fin del bucle.
@@c4:
MOV BX,DX
ADD BP,4
ADD DI,SCRW
ADD BX,SCRW*4
ADD SI,6
DEC CL
JNZ @@lpm
JMP @@c5
; =======================================
EraseBall:
MOV DI,[EraseSave1]
MOV BP,-SCRW*200*(3-1) ; 2 -> 1
TEST [FrameCounter],2
JNZ SHORT @@scrst
MOV DI,[EraseSave0]
MOV BP,-SCRW*200*(3-0) ; 1 -> 0
TEST [FrameCounter],1
JNZ SHORT @@scrst
MOV DI,[EraseSave2]
MOV BP,-SCRW*200*(3-2) ; 0 -> 2
@@scrst:
ADD DI,SCRW*200*3
MOV AX,0A000h
MOV ES,AX
MOV DX,3C4h
MOV AX,0F02h ; All planes at a time.
OUT DX,AX
MOV DX,3CEh ; Bitmask...
MOV AX,00008h ; 00000000b
OUT DX,AX
MOV SI,OFFSET BallErase
MOV CX,BallSize
@@lp0:
PUSH CX
LODSW
ADD DI,AX
LODSW
MOV CX,AX
@@l:
REPT 10
MOV AL,ES:[DI]
MOV ES:[DI+BP],AL
INC DI
DEC CX
JZ SHORT @@el
ENDM
MOV AL,ES:[DI]
MOV ES:[DI+BP],AL
INC DI
LOOP SHORT @@l
@@el:
POP CX
LOOP SHORT @@lp0
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 11111111b
OUT DX,AX
RET
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
; =======================================
.DATA
CRTCregs LABEL BYTE ; Modo 13h
DB 11h, 04h ; End vertical retrace. (0-0Fh) ; DB 11h, 8Eh
DB 00h, 64h ; Horizontal total. ; DB 00h, 5Fh
DB 01h, 4Fh ; Horizontal display enable end. ; DB 01h, 4Fh
DB 02h, 50h ; Start horizontal blanking. ; DB 02h, 50h
DB 03h, 80h+07h ; End horizontal blanking. (0-1Fh) ; DB 03h, 82h
DB 04h, 5Bh ; Start horizontal retrace. ; DB 04h, 54h
DB 05h, 80h+05h ; End horizontal retrace. (0-1Fh) ; DB 05h, 80h
DB 06h,0FFh ; Vertical total. (+7.0 +7.5) ; DB 06h, BFh
DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
DB 08h, 00h ; DB 08h, 00h
DB 09h, 41h ; DB 09h, 41h
DB 0Ah, 00h ; DB 0Ah, 00h
DB 0Bh, 00h ; DB 0Bh, 00h
DB 0Ch, 00h ; DB 0Ch, 00h
DB 0Dh, 00h ; DB 0Dh, 00h
DB 0Eh, 00h ; DB 0Eh, 00h
DB 0Fh, 00h ; DB 0Fh, 00h
DB 10h,0C0h ; Start vertical retrace. (+7.2 +7.7) ; DB 10h, 9Ch
;
; 11h ────┘ ; End vertical retrace. (0-0Fh)
DB 12h, 8Fh ; Vertical display enable end. (+7.1 +7.6) ; DB 12h, 8Fh
DB 13h, 28h ; DB 13h, 28h
DB 14h, 40h ; DB 14h, 40h
DB 15h,097h ; Start vertical blanking. (+7.3 +9.5) ; DB 15h, 96h
DB 16h,0F8h ; End vertical blanking. ; DB 16h, B9h
DB 17h,0A3h ; DB 17h, A3h
DB 18h,0FFh ; DB 18h, FFh
ALIGN 2
FrameCounter DW 0
RandSeed DW 348Bh
RandSeed2 DW 7F34h
RandSeed3 DW 32bfh
PlaneBit DB 11h
ALIGN 2
BallOffset DW 1845
BallSegment DW 0
PointsPos DW OFFSET POINTS+2
BallPosX DW 13 SHL 6
BallPosY DW 14 SHL 6
BallPosZ DW 47 SHL 6
BallVelX DW 0
BallVelY DW 0
BallVelZ DW 0
MaxDesplXp DW 0
MaxDesplYp DW 0
MaxDesplXn DW 0
MaxDesplYn DW 0
LoopCounter DW 0
FadeCounter DW 0
NFrames DW 0
NormalPalette LABEL BYTE
; ----- Normal Palette. ------------
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 63, 63, 63, 63, 61, 61, 63, 59, 59, 63, 55, 55
DB 63, 53, 53, 63, 45, 45, 63, 37, 37, 63, 32, 32
DB 63, 26, 26, 63, 24, 24, 63, 20, 20, 61, 16, 16
DB 61, 14, 14, 59, 14, 14, 59, 12, 12, 57, 8, 8
DB 55, 6, 6, 51, 4, 4, 49, 2, 2, 49, 0, 0
DB 51, 0, 0, 53, 0, 0, 55, 0, 0, 57, 0, 0
DB 59, 0, 0, 61, 0, 0, 63, 0, 0, 61, 2, 2
DB 59, 4, 4, 61, 4, 4, 59, 2, 2, 57, 0, 2
DB 55, 0, 2, 53, 0, 2, 51, 0, 2, 51, 2, 2
DB 53, 2, 2, 55, 2, 2, 49, 4, 4, 47, 6, 6
DB 45, 6, 6, 45, 6, 8, 45, 8, 8, 47, 8, 8
DB 49, 8, 8, 49, 6, 6, 47, 4, 4, 45, 2, 4
DB 45, 0, 4, 47, 0, 4, 49, 0, 4, 41, 4, 6
DB 39, 6, 8, 39, 8, 8, 41, 10, 10, 43, 10, 10
DB 45, 10, 10, 47, 10, 10, 49, 10, 10, 45, 12, 12
DB 43, 12, 12, 41, 12, 12, 39, 12, 12, 37, 12, 12
DB 37, 10, 12, 37, 10, 10, 32, 8, 10, 28, 8, 10
DB 26, 10, 12, 26, 12, 14, 24, 10, 14, 22, 10, 14
DB 18, 8, 14, 16, 8, 14, 14, 6, 14, 12, 6, 14
DB 10, 4, 14, 6, 2, 14, 4, 2, 14, 2, 2, 14
DB 2, 0, 14, 4, 0, 14, 6, 0, 12, 8, 0, 12
DB 10, 0, 12, 14, 2, 12, 16, 2, 12, 16, 2, 10
DB 14, 4, 12, 12, 4, 12, 18, 6, 12, 22, 6, 12
DB 24, 4, 10, 26, 2, 8, 26, 0, 8, 24, 0, 8
DB 20, 0, 8, 20, 0, 10, 26, 4, 10, 32, 6, 10
DB 34, 4, 8, 34, 0, 6, 37, 0, 6, 39, 2, 6
DB 39, 4, 6, 30, 2, 8, 30, 0, 8, 30, 0, 6
DB 32, 12, 12, 32, 14, 14, 30, 14, 14, 34, 14, 14
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 22, 33
DB 28, 20, 30, 26, 17, 27, 24, 15, 24, 21, 12, 22
DB 19, 10, 19, 3, 3, 3, 5, 5, 5, 7, 7, 7
DB 9, 9, 9, 10, 10, 10, 12, 12, 12, 14, 14, 14
DB 19, 10, 19, 21, 12, 22, 24, 15, 24, 26, 17, 27
DB 31, 22, 33, 33, 24, 35, 41, 21, 29, 40, 19, 27
DB 39, 17, 25, 38, 15, 23, 31, 10, 31, 33, 11, 33
DB 35, 11, 35, 37, 12, 37, 39, 13, 39, 41, 13, 41
DB 43, 14, 43, 45, 15, 45, 46, 15, 46, 48, 16, 48
DB 50, 17, 50, 52, 17, 52, 54, 18, 54, 56, 19, 56
DB 58, 19, 58, 60, 20, 60, 60, 19, 20, 60, 17, 16
DB 60, 15, 12, 60, 10, 5, 59, 9, 5, 56, 9, 4
DB 52, 8, 4, 49, 7, 4, 45, 7, 3, 41, 6, 3
DB 38, 5, 3, 34, 5, 2, 31, 4, 2, 27, 3, 2
DB 23, 3, 1, 20, 2, 1, 16, 1, 1, 13, 1, 0
DB 9, 0, 0, 0, 5, 10, 0, 5, 12, 0, 5, 13
DB 0, 5, 15, 0, 6, 17, 0, 6, 19, 0, 6, 20
DB 0, 6, 22, 0, 6, 24, 0, 6, 25, 0, 7, 27
DB 0, 7, 29, 0, 7, 31, 0, 7, 32, 0, 7, 34
DB 0, 7, 36, 0, 8, 37, 0, 8, 39, 0, 8, 41
DB 0, 8, 42, 0, 8, 44, 0, 8, 46, 0, 9, 48
DB 0, 9, 49, 0, 9, 51, 0, 9, 53, 0, 9, 54
DB 0, 9, 56, 0, 10, 58, 0, 10, 60, 0, 10, 61
DB 0, 10, 63, 8, 20, 54, 12, 20, 56, 14, 22, 56
DB 16, 24, 57, 18, 27, 57, 21, 29, 57, 0, 31, 63
DB 10, 43, 43, 10, 41, 41, 10, 39, 39, 10, 37, 37
DB 10, 35, 35, 10, 33, 33, 10, 31, 31, 13, 44, 7
DB 15, 47, 7, 16, 50, 8, 17, 53, 9, 40, 22, 13
; DB 768-($-NormalPalette) DUP(0)
EmptyPalette DB 768 DUP(0)
ALIGN 2
ScrOffsets LABEL WORD
i = 0
REPT 200
DW i
i = i + SCRW
ENDM
EraseSave0 DW 0
EraseSave1 DW 30
EraseSave2 DW 60
; INCLUDE IGNLogo.DB
.DATA?
SaveData1 DW ?
.DATA
END
; ------------------------ End of STARF.ASM ---------------------------